/* makeindex.c COPYRIGHT KIC LIMITED 2011 
 *
 * Date         Corp.   Name           Note
 * ---------- ------- ------------ -------------------
 * 2011.10.25 KIC      J.TANAKA      First Modification
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <signal.h>
#include "common.h"

wlist_t *wtop = (wlist_t *)NULL; /* 単語リストの先頭へのポインタ*/
char firstletter[BUFFSIZE];

/* Function declarations */
static int is_already_exists(char *ng_word_list , char *search_wordp);
static void sigcatch (int signo);
static void register_signal_handler(void);

/* メインロジック
*args 
* argc 引数の総個数
* argv 引数の文字列を指すポインタの配列
*Return Value
* 実行結果
* 　0 正常終了
* 　1 異常終了
*/
int main(int argc, char *argv[])
{
	
	char rbuf[BUFFSIZE]; 	/* 単語を一時的に格納する為に使用する */
	char c;			/* ファイルから取得した文字 */
	char *rbufp;		/* rbufの中身を更新する為に使用する */
	char *wp;		/* 単語へのポインタ */
	int npage, nline;	/* ページカウンタ、行カウンタ */
	FILE *fp_input; 	/* input_fileへのポインタ*/

	/* シグナルハンドラの登録 */
	register_signal_handler();

	/* オプションの取得 */
	option_t *optp = register_option(argc, argv);
	/* input_fileの指定がなければ標準入力から取得する */
	if ((fp_input = fopen(optp->input_file, "r"))==NULL){fp_input = stdin;}

	rbufp = rbuf;
	npage = 1;
	nline = 0;
	/* バッファをすべて'\0'で埋める*/
	memset(rbuf, '\0',BUFFSIZE);
        /* ファイルの終わりまでループする*/
	while((c = fgetc(fp_input)) != EOF){
		if(c == '\n'){/* 改行 */
			nline++;	
			if( nline >= PAGECOUNT ){
				npage++;
				nline = 0;
			}
		}
		if(isalnum(c)){/* 単語を構成する要素 */
			*rbufp = c;
			rbufp++;
		}else{/* 区切り文字 */
			if(rbufp == rbuf){/* rbufは空 */
				continue;
			}
			/* 単語を読み込み終えた後の処理 */
			*rbufp = '\0';
			wp = (char *)malloc(strlen(rbuf)+1);
			if(wp == (char *)NULL){/* メモリ確保失敗 */
				printf(ERR_01011);
				exit(1);
			}
			strncpy(wp, rbuf, strlen(rbuf)+1);
			if(!is_already_exists(optp->config_file,wp)){/* config_fileに登録していない単語を登録 */
				register_word(npage, wp);
			}
			/* ポインタの初期化 */
			rbufp = rbuf;
			/* バッファの初期化 */
			memset(rbuf,'\0',BUFFSIZE); 
			
		}
	}
	/* 登録した単語のリストを表示　*/
	display(wtop);	
	return EXIT_SUCCESS;
}

/* 単語search_wordpがng_word_listに登録されている単語か否かをチェックする
*args 
* ng_word_list 登録しない単語を列挙したリスト
* search_wordp 
*Return Value
* 実行結果
* 　0 正常終了
* 　1 異常終了
*/
int is_already_exists(char *ng_word_list, char *search_wordp){
	char buf[BUFFSIZE]; /* ng_word_list内の単語を格納する*/
	char *bufp;         /* bufに文字列を格納する場所を指す */
	int c;              /* ファイルから取得する文字 */
	char *ng_wordp;     /* ファイルに登録した単語 */
	FILE *fp = fopen(ng_word_list, "r"); /* ng_word_listへのファイルポインタ */

	bufp = buf;
	memset(buf, '\0', BUFFSIZE);

	while((c = fgetc(fp))!= EOF){/* ファイルの終わりまでループ */
		switch(c){
		case ' ':
		case '\t':
		case '\n':
			if(bufp != buf){/* bufに単語が格納されている */
				ng_wordp = (char *)malloc(strlen(buf)+1);
				strncpy(ng_wordp, buf, strlen(buf)+1);
				if(0 == strcmp(ng_wordp, search_wordp)){/* match */
					free(ng_wordp);
					fclose(fp);	
					return 1;
				}
			}
			bufp = buf;//initialize
			memset(buf, '\0', BUFFSIZE);
			break;
		default:
			*bufp = c;
			bufp++;
			break;
		}
	}
	fclose(fp);
	return 0;
}

/* シグナルハンドラの登録 */
static void register_signal_handler(void){
	signal(SIGHUP, sigcatch);
	signal(SIGINT, sigcatch);
	signal(SIGKILL, sigcatch);
	signal(SIGTERM, sigcatch);
	signal(SIGTSTP, sigcatch);
}

/* シグナルハンドラ*/
static void sigcatch(int signo)
{
/* If the user process interrupted, print message  and exit() 
*/
	
	printf("\n%s, (no = %d)\n", ERR_01010, signo);
	exit(EXIT_FAILURE);

}
